/*
 * @Descripttion: unTitle
 * @Author: yizheng.yuan
 * @Date: 2021-11-01 11:01:21
 * @LastEditors: yizheng.yuan
 * @LastEditTime: 2022-01-02 15:27:44
 */

// 一定要仔细看下面的文字：
// 使用过程中有任何问题，记得加我微信号 yizheng369问我
// 这里面会出现各种问题的。

// 飞书扫码登录，操作步骤
/**
 1.去我的gitee仓库下载源码：就是现在这份代码
 2.在启动项目之前，安装项目依赖，要运行 npm i 
 3.接着要运行 npm i request
 4.最后启动后台：方法1：，运行 node app.js
 5.最后启动后台：方法2：，运行 nodemon app.js（如果你还没安装nodemon就要先运行这句 npm i nodemon -g ）


 6.要通过ngrok将内网映射到外网（但如果你买了服务器，也买了域名的话，就可以用线上的域名）
  问题点1：ngrok必须要通过--authtoken参数登录，才能通过微信token验证，否则不行
  我已经将ngrok软件放在项目的tool文件里，打开，然后双击打开即可
  ngrok官网：https://dashboard.ngrok.com/get-started/setup
  （你必须要拥有一个ngrok账号，或者用github账号登录也行,没有的就去注册）
  这样运行 ngrok.exe http 80 --authtoken 1V46bLRGCfv5GK0WhTVmfNgXFaX_37oyzuEBkUSzbCKKcL2RQ

 7. 若ngrok.exe http 80正常启动后，会产生一个域名：http://4d1c-163-125-130-248.ngrok.io
    我们要把这个域名替换./html/index.html文件里面的第50行的domain

 8.下载飞书手机app软件，注册，登录进去

 9.去飞书官网https://open.feishu.cn/?lang=zh-CN，注册一个个人开发者账号

 10.【创建企业自建应用】一个，用于测试，如：test1

 11.完善资料并发布该应用:test1（更换应用对应的自己官网首页网址等），然后发布应用，启用。
  飞书官方文档 https://open.feishu.cn/document/common-capabilities/sso/web-application-sso/qr-sdk-documentation

  -- 11-1.【凭证与基础信息】可以改，也可以不改，但要看看，等下要用到
  -- 11-2.【应用功能】-》【网页】-》【启用网页】，
          填写【桌面端主页】：http://4d1c-163-125-130-248.ngrok.io/html/
          填写【移动端主页】：http://4d1c-163-125-130-248.ngrok.io/html/
  -- 11-3.【安全设置】里面的【重定向URL】为：http://4d1c-163-125-130-248.ngrok.io/html
  -- 11-4.【安全设置】里面的【IP 白名单】（直接在百度输入ip，就能查到自己的ip了）
  -- 11-5.【安全设置】里面的【H5 可信域名】为：http://4d1c-163-125-130-248.ngrok.io/html

12.将应用:test1，发布，启用成功后，
   将【凭证与基础信息】里面的
   App ID：cli_a22349c4
   App Secret: sfadfsdfsfs
   分别复制到./html/index.html文件里面的53，54行，替换client_id和client_secret的内容

13.最后在浏览器访问：http://4d1c-163-125-130-248.ngrok.io/html
 然后用自己手机里的【飞书app软件】扫码，然后点击授权登录，就能成功授权登录了。

 */


/**
 * 注意点--相关知识点
 * 
 *问题点2：-跨域设置会导致返回的页面为字符串string，故不能这样设置：res.header("Content-Type", "application/json;charset=utf-8");
  问题3：jsapi如果不完整的话，记得要【扫码关注测试公众号】，微信测试号页面找到这句话
  提醒：这个是视频讲解过程，遇到问题是，请认真看视频 https://www.bilibili.com/video/BV1XL411T73G/
  详细完整视频 微信公众号开发接收信息 https://m.bilibili.com/video/BV1XJ411P7T4?p=10&share_medium=iphone&share_plat=ios&share_source=WEIXIN&share_tag=s_i&timestamp=1648654864&unique_k=U06F2iS
 */


const fs = require("fs");
const express = require('express');
var bodyParser = require('body-parser');
const request = require('request')
// request 传参方式 https://blog.csdn.net/jianleking/article/details/80651282
const path = require('path');
const app = express();
const port = 90;

// 解析 application/json
// app.use(bodyParser.json());
// // 解析 application/x-www-form-urlencoded
// app.use(bodyParser.urlencoded());
// 接收参数
// app.use(express.json())
// app.use(express.urlencoded({extended: true}))

// 参考文章：https://cloud.tencent.com/developer/article/1679242
// 在Node.JS的app.js或者server.js中，在bodyparser中修改这个限制即可：
app.use(bodyParser.json({ limit: '100mb' }));
app.use(bodyParser.urlencoded({ limit: '100mb', extended: true }));


// 处理跨域
//设置跨域访问 
app.all('*', function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  res.header("X-Powered-By", ' 3.2.1')
  next();
})

// 处理静态资源访问
app.use('/html', express.static('html'));

/**
 * 飞书获取token
 * 2022-04-13
 * 
 */
 app.post('/getfsToken', async (req, res) => {
  // 参考 https://www.cnblogs.com/lxz123/p/15093004.html
  console.log('数据 getfsToken:', req.body);
  let data = req.body
  let ticketObj = await getfs_token(data)
  console.log('ticketObj', typeof ticketObj, ticketObj);
  ticketObj = JSON.parse(ticketObj)
  console.log('ticketObj', ticketObj);
  let userInfo = await getfs_userInfo(ticketObj.access_token)
  console.log('userInfo', userInfo);
  res.send(userInfo)
})

function getfs_token(data) {
  var url = `https://passport.feishu.cn/suite/passport/oauth/token`
  return new Promise((resolve, reject) => {
    request.post(
      {
        url,
        form: data,
      },
      async function (error, response, body) {
        if (!error) {
          resolve(body)
        } else {
          reject(JSON.parse(error))
        }
      }
    );
  })
}

// 获取飞书个人信息
function getfs_userInfo(access_token) {
  console.log('access_token', access_token);
  var url = "https://passport.feishu.cn/suite/passport/oauth/userinfo"
  return new Promise((resolve, reject) => {
    request.get(url,
      {
        headers: {
          'Authorization': `Bearer ${access_token}`
        }
      },
      async function (error, response, body) {
        if (!error) {
          resolve(body)
        } else {
          reject(JSON.parse(error))
        }
      }
    );
  })
}

app.listen(port, () => {
  console.log('server open at: http://localhost:' + port);
})